package cn.doitedu.test;

//将复杂的行为字符串进行映射（提高映射的效率）
//实际用户的行为字符串addCart、pageView（是多个字符组成的字符串，而不是单个字符）
//多个字符组成的字符串，匹配的效率就比较慢了

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//在正则匹配之前，将用户的行为字符串进行映射（就是将多个字符的字符串映射成单个数字或字母）
//addCart -> 1 或 A
//pageView -> 2 或 B
//....
//完成映射后，匹配的效率就变高了
public class EventStrMapping {

    public static void main(String[] args) {

        //在实际生产环境，事件ID一般都是一些多个字符的字符串，不是单个字符
        List<String> events = Arrays.asList("product_view", "product_focus", "product_view", "product_addCart",
                "product_view", "product_pay", "product_view", "product_focus", "product_addCart");

        //将实际的行为字符串进行映射并且简化
        //不做映射，需要写下面的正则表达式，匹配效率低，并且正则表达式书写起来复杂
        //String regex = "(.*?product_view.*?product_addCart.*?product_pay)"


        //我希望匹配的事件（即希望匹配的字符串，其他的字符串不是我关心的行为）
        //将这次希望匹配的行为字符串映射成大于0的数字，不关心的其他字符串映射成0
        List<String> targetEvent = Arrays.asList("product_view", "product_addCart", "product_pay");

        StringBuffer sb = new StringBuffer();

        //遍历用户实际产生的行为字符串
        for (String event : events) {
            //从你希望匹配的字符串中，进行indexOf
            //找到了就大于等于0，没找到就返回-1
            int index = targetEvent.indexOf(event);
            //System.out.println(index);
            sb.append(index+1);
        }

        System.out.println(sb.toString());
        //匹配行为次数，匹配关系的第一个事件的行为次数

        //String regex = "(2)";
        String regex = "(.*?1.*?2)";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(sb.toString());
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        System.out.println(count);

    }

}
